package com.dpl.yyrj.ui.imageChoose;

import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;

import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.AsyncTask;
import android.provider.MediaStore;
import android.widget.ImageButton;
import android.widget.ImageView;

public class Util {
	private List<LoadBitAsynk> imgLoading;

	Context context;
	private final String[] IMAGE_PROJECTION = {
            MediaStore.Images.Media.DATA,                  //图片路径
            MediaStore.Images.Media.BUCKET_DISPLAY_NAME,   //相册名字
//            MediaStore.Images.Media.DATE_ADDED,            //创建时间
            MediaStore.Images.Media.DATE_MODIFIED,            //最后修改时间
//            MediaStore.Images.Media.MIME_TYPE,             //图片类型
//            MediaStore.Images.Media.SIZE,                  //图片大小
            MediaStore.Images.Media.BUCKET_ID,             //相册id
//            MediaStore.Images.Media._ID                    //图片id
    };

	public String tag = "com.ozzo.chooseimg.Util";

	public Util(Context context) {
		this.context = context;
	}

	/**
	 * 获取全部图片地址
	 * 
	 * @return
	 */
	public List<Album> listAlldir() {
//		long startTime=System.currentTimeMillis();   //获取开始时间
		Intent intent = new Intent(Intent.ACTION_PICK,
				MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
		Uri uri = intent.getData();
		Cursor cursor = context.getContentResolver().query(uri, IMAGE_PROJECTION, null,
				null, IMAGE_PROJECTION[2] + " DESC");// 根据最后修改时间排序
		if (cursor == null) {
			return null;
		}
		AlbumList imageList = new AlbumList();
		
		while (cursor.moveToNext()){
			imageList.addIamge(cursor.getString(cursor.getColumnIndexOrThrow(IMAGE_PROJECTION[0])),
					cursor.getString(cursor.getColumnIndexOrThrow(IMAGE_PROJECTION[1])),
					cursor.getLong(cursor.getColumnIndexOrThrow(IMAGE_PROJECTION[2])),
					cursor.getLong(cursor.getColumnIndexOrThrow(IMAGE_PROJECTION[3])));
		}
		
//		long endTime=System.currentTimeMillis(); //获取结束时间

//		System.out.println("程序运行时间： "+(endTime-startTime)+"ms");
//		Toast.makeText(context, "相册打开时间" + (endTime-startTime)+"ms", 0).show();
		return imageList.albumList;
	}

	// 显示原生图片尺寸大小
	public Bitmap getPathBitmap(Uri imageFilePath, int dw, int dh)
			throws FileNotFoundException {
		// 获取屏幕的宽和高
		/**
		 * 为了计算缩放的比例，我们需要获取整个图片的尺寸，而不是图片
		 * BitmapFactory.Options类中有一个布尔型变量inJustDecodeBounds，将其设置为true
		 * 这样，我们获取到的就是图片的尺寸，而不用加载图片了。
		 * 当我们设置这个值的时候，我们接着就可以从BitmapFactory.Options的outWidth和outHeight中获取到值
		 */
		BitmapFactory.Options op = new BitmapFactory.Options();
		op.inJustDecodeBounds = true;
		// 由于使用了MediaStore存储，这里根据URI获取输入流的形式
		Bitmap pic = BitmapFactory.decodeStream(context.getContentResolver()
				.openInputStream(imageFilePath), null, op);

		int wRatio = (int) Math.ceil(op.outWidth / (float) dw); // ceil 向上取整
		int hRatio = (int) Math.ceil(op.outHeight / (float) dh);

		/**
		 * 接下来，我们就需要判断是否需要缩放以及到底对宽还是高进行缩放。 如果高和宽不是全都超出了屏幕，那么无需缩放。
		 * 如果高和宽都超出了屏幕大小，则如何选择缩放呢》 这需要判断wRatio和hRatio的大小
		 * 大的一个将被缩放，因为缩放大的时，小的应该自动进行同比率缩放。 缩放使用的还是inSampleSize变量
		 */
		if (wRatio > 1 && hRatio > 1) {
			if (wRatio > hRatio) {
				op.inSampleSize = wRatio;
			} else {
				op.inSampleSize = hRatio;
			}
		}
		op.inJustDecodeBounds = false; // ע�����һ��Ҫ����Ϊfalse����Ϊ�������ǽ�������Ϊtrue����ȡͼƬ�ߴ���
		pic = BitmapFactory.decodeStream(context.getContentResolver()
				.openInputStream(imageFilePath), null, op);

		return pic;
	}

	public String getfileinfo(String data) {
		String filename[] = data.split("/");
		if (filename != null) {
			return filename[filename.length - 2];
		}
		return null;
	}

	public void imgExcute(ImageView imageView, ImgCallBack icb,
			ImageButton imageButton, String... params) {
		LoadBitAsynk loadBitAsynk = new LoadBitAsynk(imageView, icb, imageButton);
		if (imgLoading == null) {// 空的时候
			imgLoading = new ArrayList<LoadBitAsynk>();
		} else if (imgLoading.size() == 0) {// 没有任务或者已执行完

		} else {// 还有任务
			if (imgLoading.size() > 30) {
				// LogUtil.log(tag, "超出30条，清理最前面的一条任务");
				imgLoading.get(0).cancel(true);
				imgLoading.remove(0);// 清理最前面的任务
			}
		}
		loadBitAsynk.execute(params);
		imgLoading.add(loadBitAsynk);// 添加到list
	}

	public class LoadBitAsynk extends AsyncTask<String, Integer, Bitmap> {

		ImageView imageView;
		ImgCallBack icb;
		ImageButton imageButton;

		LoadBitAsynk(ImageView imageView, ImgCallBack icb, ImageButton imageButton) {
			this.imageView = imageView;
			this.icb = icb;
			this.imageButton = imageButton;
		}

		@Override
		protected Bitmap doInBackground(String... params) {
			Bitmap bitmap = null;
			try {
				if (params != null) {
					for (int i = 0; i < params.length; i++) {
						bitmap = getPathBitmap(
								Uri.fromFile(new File(params[i])), 350, 350);
					}
				}
			} catch (FileNotFoundException e) {
				e.printStackTrace();
			}

			return bitmap;
		}

		@Override
		protected void onPostExecute(Bitmap result) {
			super.onPostExecute(result);
			if (result != null) {
				// imageView.setImageBitmap(result);
				icb.resultImgCall(imageView, imageButton, result);
				// LogUtil.log(tag, "执行完成");
			}
		}

		@Override
		protected void onCancelled() {
			// TODO Auto-generated method stub
			super.onCancelled();
			// LogUtil.log(tag, "执行被取消");
		}

	}

}
